import configparser
from utils.file_dir import get_file_dir


# ---------- 读取 server.ini ----------
def read_server(sections, options):
    # 每次创建新的 ConfigParser 实例
    config = configparser.ConfigParser()
    file_path = get_file_dir("config/server.ini")

    # 读取文件（确保使用正确路径）
    config.read(file_path)

    # 直接获取值（删除无用的 sections() 和 items() 调用）
    try:
        value = config.get(sections, options)
    except (configparser.NoSectionError, configparser.NoOptionError) as e:
        raise ValueError(f"配置错误: {e}")
    return value


# ---------- 读取 associateddata.ini ----------
def read_associateddata(sections, options):
    # 每次创建新的 ConfigParser 实例
    config = configparser.ConfigParser()
    file_path = get_file_dir("config/associateddata.ini")

    config.read(file_path)

    try:
        value = config.get(sections, options)
    except (configparser.NoSectionError, configparser.NoOptionError) as e:
        raise ValueError(f"配置错误: {e}")
    return value


# ---------- 写入 associateddata.ini ----------
def write_conf(sections, options, values=None):
    # 每次创建新的 ConfigParser 实例，并读取当前文件内容
    config = configparser.ConfigParser()
    file_path = get_file_dir("config/associateddata.ini")

    # 读取现有内容（避免合并旧数据）
    config.read(file_path)

    # 确保 Section 存在
    if not config.has_section(sections):
        config.add_section(sections)

    # 设置值
    if values is not None:
        config.set(sections, options, str(values))

    # 写入文件（覆盖模式）
    with open(file_path, 'w', encoding='utf-8') as f:
        config.write(f)


# ---------- 清空 Section 的值 ----------
def clear_section_values(section):
    # 每次创建新的 ConfigParser 实例
    config = configparser.ConfigParser()
    file_path = get_file_dir("config/associateddata.ini")

    # 读取现有内容
    config.read(file_path)

    if not config.has_section(section):
        raise ValueError(f"Section '{section}' 不存在")

    # 清空所有 Key 的值
    for key in config.options(section):
        config.set(section, key, '')

    # 写入文件
    with open(file_path, 'w', encoding='utf-8') as f:
        config.write(f)


# 读取整个配置文件下所有的值
def read_sections(section):
    # 每次创建新的 ConfigParser 实例
    config = configparser.ConfigParser()
    file_path = get_file_dir("config/associateddata.ini")
    # 读取现有内容
    config.read(file_path)

    if not config.has_section(section):
        raise ValueError(f"Section '{section}' 不存在")
    return config.options(section)


# 新增文件中的变量
def new_conf_options(sections, options):
    # 每次创建新的 ConfigParser 实例，并读取当前文件内容
    config = configparser.ConfigParser()
    file_path = get_file_dir("config/associateddata.ini")

    # 读取现有内容（避免合并旧数据）
    config.read(file_path)

    # 确保 Section 存在
    if not config.has_section(sections):
        config.add_section(sections)

    # 设置值
    if options is not None:
        config.set(sections, options, "")

    # 写入文件（覆盖模式）
    with open(file_path, 'w', encoding='utf-8') as f:
        config.write(f)


# 删除文件中的变量
def delete_conf_options(section, option):
    # 每次创建新的 ConfigParser 实例，并读取当前文件内容
    config = configparser.ConfigParser()
    file_path = get_file_dir("config/associateddata.ini")

    # 读取现有内容（避免合并旧数据）
    config.read(file_path)

    # 确保 Section 存在
    if not config.has_section(section):
        config.add_section(section)

        # 删除指定的 option
    if config.has_option(section, option):
        config.remove_option(section, option)
        print(f"Option '{option}' 已从 Section '{section}' 中删除")
    else:
        print(f"Option '{option}' 在 Section '{section}' 中不存在")
        return

        # 将更改写回文件
    with open(file_path, 'w') as configfile:
        config.write(configfile)
    print(f"配置文件已更新")


# 读取配置文件中的数据，返回一个字典
def read_ini_file():
    config = configparser.ConfigParser()
    try:
        config.read(get_file_dir("config/associateddata.ini"), encoding='utf-8')  # 尝试以 utf-8 编码读取
    except UnicodeDecodeError:
        config.read(get_file_dir("config/associateddata.ini"), encoding='gbk')  # 如果 utf-8 解码失败，尝试 gbk 编码

    config_dict = {}
    for section in config.sections():
        config_dict[section] = {}
        for key, value in config.items(section):
            config_dict[section][key] = value
    return config_dict


if __name__ == "__main__":
    print(read_ini_file())
